Localized file check-in by OneLocBuild Task: Build definition ID 1218: Build ID 2982331#8510
Localized file check-in by OneLocBuild Task: Build definition ID 1218: Build ID 2982331#8510dotnet-bot wants to merge 6 commits into
Conversation
…: Build ID 2981843
There was a problem hiding this comment.
Pull request overview
This OneLocBuild-generated PR updates Microsoft.Testing.Platform localized XLF resource files under src/Platform/Microsoft.Testing.Platform/Resources/xlf/.
Changes:
- Removes the
TerminalAnsiOptionDescriptiontrans-unit from multiple locale XLF files. - Removes the
TerminalAnsiOptionInvalidArgumenttrans-unit from multiple locale XLF files.
Reviewed changes
Copilot reviewed 13 out of 13 changed files in this pull request and generated 13 comments.
Show a summary per file
| File | Description |
|---|---|
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.cs.xlf | Removes TerminalAnsiOption* trans-units from the Czech locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.de.xlf | Removes TerminalAnsiOption* trans-units from the German locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.es.xlf | Removes TerminalAnsiOption* trans-units from the Spanish locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.fr.xlf | Removes TerminalAnsiOption* trans-units from the French locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.it.xlf | Removes TerminalAnsiOption* trans-units from the Italian locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ja.xlf | Removes TerminalAnsiOption* trans-units from the Japanese locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ko.xlf | Removes TerminalAnsiOption* trans-units from the Korean locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pl.xlf | Removes TerminalAnsiOption* trans-units from the Polish locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.pt-BR.xlf | Removes TerminalAnsiOption* trans-units from the Portuguese (Brazil) locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.ru.xlf | Removes TerminalAnsiOption* trans-units from the Russian locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.tr.xlf | Removes TerminalAnsiOption* trans-units from the Turkish locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hans.xlf | Removes TerminalAnsiOption* trans-units from the Chinese (Simplified) locale XLF. |
| src/Platform/Microsoft.Testing.Platform/Resources/xlf/PlatformResources.zh-Hant.xlf | Removes TerminalAnsiOption* trans-units from the Chinese (Traditional) locale XLF. |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Zprostředkovatel telemetrie je už nastavený.</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Der Telemetrieanbieter ist bereits festgelegt</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">El proveedor de telemetría ya está establecido</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Le fournisseur de télémétrie est déjà défini</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Il provider di telemetria è già impostato</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">O provedor de telemetria já está definido</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Поставщик телеметрии уже настроен</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Telemetri sağlayıcısı zaten ayarlanmış</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">已设置遥测提供程序</target> | ||
| <note /> | ||
| </trans-unit> |
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">遙測提供者已設定</target> | ||
| <note /> | ||
| </trans-unit> |
…: Build ID 2981872
Localization Synchronization IssueThis PR has a critical synchronization problem between source resources and localized files: Issue SummaryThe OneLocBuild task is deleting Timeline of Events
Why This Will BreakThe
For non-English locales, the ResourceManager will fail to find these keys after this PR merges, causing either:
Recommended ResolutionOption A (Preferred if
Option B (If
Files to CheckSource (still contains the strings):
Usage (references these resource keys):
Dimension 9 (Localization & Resources): BLOCKING issue - source/localized resource mismatch will break non-English users. Note 🔒 Integrity filter blocked 1 itemThe following item was blocked because it doesn't meet the GitHub integrity level.
To allow these resources, lower tools:
github:
min-integrity: approved # merged | approved | unapproved | none
|
Evangelink
left a comment
There was a problem hiding this comment.
Expert Code Review - PR #8510
This automated localization PR contains a critical synchronization bug that will break non-English users of the --ansi CLI option.
Findings Summary
| # | Dimension | Verdict |
|---|---|---|
| 9 | Localization & Resources | 🔴 1 BLOCKING |
❌ 1/21 dimensions with findings (20 dimensions not applicable to localization-only PR)
Critical Finding
- Localization & Resources — Source
.resxcontains resource strings that this PR deletes from all.xlffiles
Issue Details
The OneLocBuild task is removing TerminalAnsiOptionDescription and TerminalAnsiOptionInvalidArgument translation units from all 13 localized .xlf files. However, the source PlatformResources.resx file still contains and actively uses these resource strings for the --ansi CLI option added in PR #8493 (merged hours before this PR was created).
Impact:
- The
--ansihelp text will not be localized for Czech, German, Spanish, French, Italian, Japanese, Korean, Polish, Portuguese, Russian, Turkish, and Chinese users - Error messages for invalid
--ansiarguments will fall back to English - Violates the "Localization Done Right" principle (Overarching Principle #7)
Root Cause:
These strings were added with state="new" (untranslated) and OneLocBuild's cleanup logic is removing them before they were sent through the translation pipeline. This is a timing issue between feature merges and localization builds.
Resolution Required:
Either (A) retain these entries in .xlf files until properly translated, or (B) if the --ansi feature is being removed, delete the strings from PlatformResources.resx first.
Review Methodology
This review applied the 21-dimension expert-reviewer framework. Dimensions 1-8, 10-21 are not applicable to this PR as it only modifies localization files. Dimension 9 (Localization & Resources) was evaluated in depth and revealed the critical bug described above.
See inline comment on PlatformResources.cs.xlf:822 for full technical details and verification steps.
Note
🔒 Integrity filter blocked 1 item
The following item was blocked because it doesn't meet the GitHub integrity level.
- de80fc4
list_commits: has lower integrity than agent requires. The agent cannot read data with integrity below "approved".
To allow these resources, lower min-integrity in your GitHub frontmatter:
tools:
github:
min-integrity: approved # merged | approved | unapproved | noneGenerated by Expert Code Review (on open) for issue #8510 · ● 8.7M
| <source>Telemetry provider is already set</source> | ||
| <target state="translated">Zprostředkovatel telemetrie je už nastavený.</target> | ||
| <note /> | ||
| </trans-unit> |
There was a problem hiding this comment.
[BLOCKING] Localization & Resources (Dimension 9)
This PR deletes the TerminalAnsiOptionDescription and TerminalAnsiOptionInvalidArgument translation units from all 13 localized .xlf files, but the source PlatformResources.resx file still contains these resource strings.
Concrete failing scenario:
- User launches test executable with locale set to Czech (cs), German (de), or any other localized language
- Help text or error message attempts to load
TerminalAnsiOptionDescriptionorTerminalAnsiOptionInvalidArgument - The ResourceManager cannot find these keys in the
.xlffiles (because this PR deleted them) - Result: Either fallback to English text (breaking localized experience) or
MissingManifestResourceException
Root cause:
These strings were added in commit 8359a8a (PR #8493) with state="new" (untranslated), never sent to the localization pipeline, and are now being incorrectly deleted by OneLocBuild's cleanup logic.
Impact:
- The
--ansiCLI option added in PR Add --ansi <auto|on|off> CLI option for explicit ANSI control (#5081) #8493 will not be properly localized for non-English users - Error messages for invalid
--ansiarguments will not be localized - This breaks the "Localization Done Right" principle (Bug Fix#233637 : DataSource tests name is not getting appended by "(Data Row *)" #7 in the review guide)
Recommendation:
- Do not merge this PR in its current state
- Retain these translation units in all
.xlffiles (even withstate="new") - Ensure the localization pipeline processes these strings for the next release
- OR: If these strings are truly being removed from the codebase, remove them from
PlatformResources.resxfirst, then allow OneLocBuild to clean up the.xlffiles
Verification:
# Source .resx still contains these strings:
grep -A2 "TerminalAnsiOption" src/Platform/Microsoft.Testing.Platform/Resources/PlatformResources.resx
# But this PR deletes them from all .xlf files
git diff main -- src/Platform/Microsoft.Testing.Platform/Resources/xlf/*.xlf | grep "TerminalAnsiOption"…: Build ID 2982315
| <trans-unit id="AvoidAssertsInCatchBlocksDescription"> | ||
| <source>Using asserts in catch blocks is problematic because the test will pass even if no exception is thrown and the catch block is never executed. Use 'Assert.Throws', 'Assert.ThrowsExactly', 'Assert.ThrowsAsync' or 'Assert.ThrowsExactlyAsync' to verify that an exception is thrown, and then make additional assertions on the caught exception without using the try-catch block. The rule also flags 'throw new AssertFailedException(...)' and 'throw new AssertInconclusiveException(...)' (the desugared forms of 'Assert.Fail' and 'Assert.Inconclusive'). 'Assert.Inconclusive' (and 'throw new AssertInconclusiveException(...)') is exempt when used inside a filtered catch ('catch (...) when (...)'), because demoting a caught failure to an Inconclusive outcome is the only use case that cannot be expressed without a catch block. For other intentional bypasses (for example, attaching a runtime-built message to the failure), suppress the diagnostic with '#pragma warning disable MSTEST0058'.</source> | ||
| <target state="new">Using asserts in catch blocks is problematic because the test will pass even if no exception is thrown and the catch block is never executed. Use 'Assert.Throws', 'Assert.ThrowsExactly', 'Assert.ThrowsAsync' or 'Assert.ThrowsExactlyAsync' to verify that an exception is thrown, and then make additional assertions on the caught exception without using the try-catch block. The rule also flags 'throw new AssertFailedException(...)' and 'throw new AssertInconclusiveException(...)' (the desugared forms of 'Assert.Fail' and 'Assert.Inconclusive'). 'Assert.Inconclusive' (and 'throw new AssertInconclusiveException(...)') is exempt when used inside a filtered catch ('catch (...) when (...)'), because demoting a caught failure to an Inconclusive outcome is the only use case that cannot be expressed without a catch block. For other intentional bypasses (for example, attaching a runtime-built message to the failure), suppress the diagnostic with '#pragma warning disable MSTEST0058'.</target> | ||
| <target state="translated">Używanie asercji w blokach catch jest problematyczne, ponieważ test zakończy się powodzeniem, nawet jeśli nie zostanie zgłoszony żaden wyjątek i blok catch nigdy nie zostanie wykonany. Użyj instrukcji „Assert.Throws”, „Assert.ThrowsExactly”, „Assert.ThrowsAsync” lub „Assert.ThrowsExactlyAsync”, aby sprawdzić, czy zgłoszono wyjątek, a następnie wykonaj dodatkowe asercje dla przechwyconego wyjątku bez użycia bloku try-catch. Reguła oznacza również „throw new AssertFailedException(...)” i „throw new AssertInconclusiveException(...)” (usunięte formy „Assert.Fail” i „Assert.Inconclusive”). Element „Assert.Inconclusive” (i „throw new AssertInconclusiveException(...)”) jest wykluczony, gdy jest używany wewnątrz przefiltrowanego polecenia catch („catch (...) when (...)”), ponieważ obniżenie przechwyconego błędu do niejednoznacznego wyniku jest jedynym przypadkiem użycia, którego nie można wyrazić bez bloku catch. W przypadku innych celowych obejść (na przykład dołączenia komunikatu utworzonego w środowisku uruchomieniowym do awarii) pomiń diagnostykę za pomocą polecenia „#pragma ostrzeżenie wyłącz MSTEST0058”.</target> |
| <trans-unit id="AzureDevOpsLivePublishingFinalizeWaitTimedOut"> | ||
| <source>Azure DevOps live publishing timed out after {0} waiting for {1} participant file(s); finalizing the run anyway.</source> | ||
| <target state="new">Azure DevOps live publishing timed out after {0} waiting for {1} participant file(s); finalizing the run anyway.</target> | ||
| <target state="translated">Azure DevOps: время ожидания публикации в реальном времени истекло после {0} ожидания файлов участника ({1}) ; запуск будет завершен в любом случае.</target> |
…: Build ID 2982315
…: Build ID 2982315
…: Build ID 2982315
| <trans-unit id="AvoidAssertsInCatchBlocksDescription"> | ||
| <source>Using asserts in catch blocks is problematic because the test will pass even if no exception is thrown and the catch block is never executed. Use 'Assert.Throws', 'Assert.ThrowsExactly', 'Assert.ThrowsAsync' or 'Assert.ThrowsExactlyAsync' to verify that an exception is thrown, and then make additional assertions on the caught exception without using the try-catch block. The rule also flags 'throw new AssertFailedException(...)' and 'throw new AssertInconclusiveException(...)' (the desugared forms of 'Assert.Fail' and 'Assert.Inconclusive'). 'Assert.Inconclusive' (and 'throw new AssertInconclusiveException(...)') is exempt when used inside a filtered catch ('catch (...) when (...)'), because demoting a caught failure to an Inconclusive outcome is the only use case that cannot be expressed without a catch block. For other intentional bypasses (for example, attaching a runtime-built message to the failure), suppress the diagnostic with '#pragma warning disable MSTEST0058'.</source> | ||
| <target state="new">Using asserts in catch blocks is problematic because the test will pass even if no exception is thrown and the catch block is never executed. Use 'Assert.Throws', 'Assert.ThrowsExactly', 'Assert.ThrowsAsync' or 'Assert.ThrowsExactlyAsync' to verify that an exception is thrown, and then make additional assertions on the caught exception without using the try-catch block. The rule also flags 'throw new AssertFailedException(...)' and 'throw new AssertInconclusiveException(...)' (the desugared forms of 'Assert.Fail' and 'Assert.Inconclusive'). 'Assert.Inconclusive' (and 'throw new AssertInconclusiveException(...)') is exempt when used inside a filtered catch ('catch (...) when (...)'), because demoting a caught failure to an Inconclusive outcome is the only use case that cannot be expressed without a catch block. For other intentional bypasses (for example, attaching a runtime-built message to the failure), suppress the diagnostic with '#pragma warning disable MSTEST0058'.</target> | ||
| <target state="translated">Używanie asercji w blokach catch jest problematyczne, ponieważ test zakończy się powodzeniem, nawet jeśli nie zostanie zgłoszony żaden wyjątek i blok catch nigdy nie zostanie wykonany. Użyj instrukcji „Assert.Throws”, „Assert.ThrowsExactly”, „Assert.ThrowsAsync” lub „Assert.ThrowsExactlyAsync”, aby sprawdzić, czy zgłoszono wyjątek, a następnie wykonaj dodatkowe asercje dla przechwyconego wyjątku bez użycia bloku try-catch. Reguła oznacza również „throw new AssertFailedException(...)” i „throw new AssertInconclusiveException(...)” (usunięte formy „Assert.Fail” i „Assert.Inconclusive”). Element „Assert.Inconclusive” (i „throw new AssertInconclusiveException(...)”) jest wykluczony, gdy jest używany wewnątrz przefiltrowanego polecenia catch („catch (...) when (...)”), ponieważ obniżenie przechwyconego błędu do niejednoznacznego wyniku jest jedynym przypadkiem użycia, którego nie można wyrazić bez bloku catch. W przypadku innych celowych obejść (na przykład dołączenia komunikatu utworzonego w środowisku uruchomieniowym do awarii) pomiń diagnostykę za pomocą polecenia „#pragma ostrzeżenie wyłącz MSTEST0058”.</target> |
| <trans-unit id="AzureDevOpsLivePublishingFinalizeWaitTimedOut"> | ||
| <source>Azure DevOps live publishing timed out after {0} waiting for {1} participant file(s); finalizing the run anyway.</source> | ||
| <target state="new">Azure DevOps live publishing timed out after {0} waiting for {1} participant file(s); finalizing the run anyway.</target> | ||
| <target state="translated">Azure DevOps: время ожидания публикации в реальном времени истекло после {0} ожидания файлов участника ({1}) ; запуск будет завершен в любом случае.</target> |
This is the pull request automatically created by the OneLocBuild task in the build process to check-in localized files generated based upon translation source files (.lcl files) handed-back from the downstream localization pipeline. If there are issues in translations, visit https://aka.ms/icxLocBug and log bugs for fixes. The OneLocBuild wiki is https://aka.ms/onelocbuild and the localization process in general is documented at https://aka.ms/AllAboutLoc.